Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Texture mapping</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Texture_mapping"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Texture_mapping rootpage-Texture_mapping skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Texture mapping</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">


<p><b>Texture mapping</b><sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> is a term used in <a href="Computer_graphics" title="Computer graphics">computer graphics</a> to describe how 2D images are projected onto 3D models. The most common variant is the <a href="UV_mapping" title="UV mapping">UV unwrap</a>, which can be described as an inverse paper cutout, where the surfaces of a 3D model are cut apart so that it can be unfolded into a 2D coordinate space (UV space).
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Semantic">Semantic</h2></div>
<p><i>Texture mapping</i> can multiply refer to (1) the task of unwrapping a 3D model (converting the surface of a 3D model into a 2D texture map), (2) applying a 2D texture map onto the surface of a 3D model, and (3) the <a href="3D_software" class="mw-redirect" title="3D software">3D software</a> algorithm that performs both tasks.
</p><p>A <i>texture map</i> refers to a 2D image ("texture") that adds visual detail to a 3D model. The image can be stored as a <a href="Raster_graphics" title="Raster graphics">raster graphic</a>. A texture that stores a specific property—such as bumpiness, reflectivity, or transparency—is also referred to as a <i>color map</i> or <i>roughness map</i>.
</p><p>The coordinate space that converts from a 3D model's 3D space into a 2D space for sampling from the texture map is variously called <i>UV space</i>, <i>UV coordinates</i>, or <i>texture space</i>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Algorithm">Algorithm</h2></div>
<p>The following is a simplified explanation of how an algorithm could work to <a href="Rendering_(computer_graphics)" title="Rendering (computer graphics)">render</a> an image:
</p>
<ol><li>For each pixel, trace the coordinates of the screen into the 3D scene.</li>
<li>If a 3D model is hit or, more precisely, the polygon of a 3D model hits the 2D UV coordinates, then</li>
<li>The UV Coordinates are used to read the color from the texture and apply it to the pixel.</li></ol>
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p>The original technique was pioneered by <a href="Edwin_Catmull" title="Edwin Catmull">Edwin Catmull</a> in 1974 as part of his doctoral thesis.<sup id="cite_ref-Catmull_thesis_4-0" class="reference"><a href="#cite_note-Catmull_thesis-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p><p>Texture mapping originally referred to <i>diffuse mapping</i>, a method that simply mapped <a href="Pixel" title="Pixel">pixels</a> from a texture to a <a href="Polygon_mesh" title="Polygon mesh">3D surface</a> ("wrapping" the image around the object). In recent decades, the advent of multi-pass rendering, <a href="Multitexturing" class="mw-redirect" title="Multitexturing">multitexturing</a>, <a href="Mipmap" title="Mipmap">mipmaps</a>, and more complex mappings such as <a href="Height_mapping" class="mw-redirect" title="Height mapping">height mapping</a>, <a href="Bump_mapping" title="Bump mapping">bump mapping</a>, <a href="Normal_mapping" title="Normal mapping">normal mapping</a>, <a href="Displacement_mapping" title="Displacement mapping">displacement mapping</a>, <a href="Reflection_mapping" title="Reflection mapping">reflection mapping</a>, <a href="Specular_mapping" class="mw-redirect" title="Specular mapping">specular mapping</a>, <a href="Ambient_occlusion" title="Ambient occlusion">occlusion mapping</a>, and many other variations on the technique (controlled by a <a href="Materials_system" class="mw-redirect" title="Materials system">materials system</a>) have made it possible to simulate near-<a href="Photorealistic_rendering" class="mw-redirect" title="Photorealistic rendering">photorealism</a> in <a href="Real-time_data" title="Real-time data">real time</a> by vastly reducing the number of <a href="Polygon" title="Polygon">polygons</a> and lighting calculations needed to construct a realistic and functional 3D scene.
</p>

<div class="mw-heading mw-heading2"><h2 id="Texture_maps">Texture maps</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">"Texture maps" redirects here. For the album by Steve Roach, see <a href="Texture_Maps%3A_The_Lost_Pieces_Vol._3" title="Texture Maps: The Lost Pieces Vol. 3">Texture Maps: The Lost Pieces Vol. 3</a>.</div>
<p>A <b><style data-mw-deduplicate="TemplateStyles:r1238216509">
/* start https://en.wikipedia.org/ */


.mw-parser-output .vanchor>:target~.vanchor-text{background-color:#b1d2ff}@media screen{html.skin-theme-clientpref-night .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .vanchor>:target~.vanchor-text{background-color:#0f4dc9}}


/* end https://en.wikipedia.org/ */
</style><span class="vanchor"><span class="vanchor-text">texture map</span></span></b><sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> is an image applied ("mapped") to the surface of a shape or <a href="Polygon" title="Polygon">polygon</a>.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> This may be a <a href="Bitmap_image" class="mw-redirect" title="Bitmap image">bitmap image</a> or a <a href="Procedural_texture" title="Procedural texture">procedural texture</a>. They may be stored in common <a href="Image_file_formats" class="mw-redirect" title="Image file formats">image file formats</a>, referenced by 3D model formats or <a href="Materials_system" class="mw-redirect" title="Materials system">material definitions</a>, and assembled into <a href="Resource_bundles" class="mw-redirect" title="Resource bundles">resource bundles</a>.
</p><p>They may have one to three dimensions, although two dimensions are most common for visible surfaces. For use with modern hardware, texture map data may be stored in <a href="Morton_order" class="mw-redirect" title="Morton order">swizzled</a> or tiled orderings to improve <a href="Cache_coherency" class="mw-redirect" title="Cache coherency">cache coherency</a>. <a href="Rendering_APIs" class="mw-redirect" title="Rendering APIs">Rendering APIs</a> typically manage texture map resources (which may be located in <a href="Device_memory" class="mw-redirect" title="Device memory">device memory</a>) as buffers or surfaces, and may allow '<a href="Render_to_texture" class="mw-redirect" title="Render to texture">render to texture</a>' for additional effects such as post processing or <a href="Environment_mapping" class="mw-redirect" title="Environment mapping">environment mapping</a>.
</p><p>Texture maps usually contain <a href="RGB" class="mw-redirect" title="RGB">RGB</a> color data (either stored as <a href="Direct_color" class="mw-redirect" title="Direct color">direct color</a>, <a href="Texture_compression" title="Texture compression">compressed formats</a>, or <a href="Indexed_color" title="Indexed color">indexed color</a>), and sometimes an additional channel for <a href="Alpha_blending" class="mw-redirect" title="Alpha blending">alpha blending</a> (<a href="RGBA" class="mw-redirect" title="RGBA">RGBA</a>) especially for <a href="Billboard_(computer_graphics)" class="mw-redirect" title="Billboard (computer graphics)">billboards</a> and decal overlay textures. It is possible to use the <a href="Alpha_channel" class="mw-redirect" title="Alpha channel">alpha channel</a> (which may be convenient to store in formats parsed by hardware) for other uses such as <a href="Specularity" title="Specularity">specularity</a>.
</p><p>Multiple texture maps (or <a href="Image_channels" class="mw-redirect" title="Image channels">channels</a>) may be combined for control over <a href="Specularity" title="Specularity">specularity</a>, <a href="Normal_(geometry)" title="Normal (geometry)">normals</a>, <a href="Displacement_mapping" title="Displacement mapping">displacement</a>, or <a href="Subsurface_scattering" title="Subsurface scattering">subsurface scattering</a>, e.g. for skin rendering.
</p><p>Multiple texture images may be combined in <a href="Texture_atlases" class="mw-redirect" title="Texture atlases">texture atlases</a> or <a href="Array_textures" class="mw-redirect" title="Array textures">array textures</a> to reduce state changes for modern hardware. (They may be considered a modern evolution of <a href="Tile_map" class="mw-redirect" title="Tile map">tile map graphics</a>). Modern hardware often supports <a href="Cube_map" class="mw-redirect" title="Cube map">cube map</a> textures with multiple faces for environment mapping.
</p>
<div class="mw-heading mw-heading3"><h3 id="Creation">Creation</h3></div>
<p>Texture maps may be acquired by <a href="3D_scanning" title="3D scanning">scanning</a> or <a href="Digital_photography" title="Digital photography">digital photography</a>, designed in <a href="Image_manipulation_software" class="mw-redirect" title="Image manipulation software">image manipulation software</a> such as <a href="GIMP" title="GIMP">GIMP</a> or <a href="Photoshop" class="mw-redirect" title="Photoshop">Photoshop</a>, or painted onto 3D surfaces directly in a <a href="3D_paint_tool" class="mw-redirect" title="3D paint tool">3D paint tool</a> such as <a href="Mudbox" class="mw-redirect" title="Mudbox">Mudbox</a> or <a href="ZBrush" title="ZBrush">ZBrush</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Texture_application">Texture application</h3></div>
<p>This process is akin to applying patterned paper to a plain white box. Every vertex in a polygon is assigned a <a href="Texture_coordinate" class="mw-redirect" title="Texture coordinate">texture coordinate</a> (which in the 2D case is also known as <a href="UV_coordinate" class="mw-redirect" title="UV coordinate">UV coordinates</a>).<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> This may be done through explicit assignment of <a href="Vertex_attributes" class="mw-redirect" title="Vertex attributes">vertex attributes</a>, manually edited in a 3D modelling package through <a href="UV_unwrapping_tools" class="mw-redirect" title="UV unwrapping tools">UV unwrapping tools</a>. It is also possible to associate a procedural transformation from 3D space to texture space with the <a href="Physically_based_rendering" title="Physically based rendering">material</a>. This might be accomplished via <a href="Planar_projection" title="Planar projection">planar projection</a> or, alternatively, <a href="Cylindrical_coordinates" class="mw-redirect" title="Cylindrical coordinates">cylindrical</a> or <a href="Spherical_coordinates" class="mw-redirect" title="Spherical coordinates">spherical</a> mapping. More complex mappings may consider the distance along a surface to minimize distortion. These coordinates are interpolated across the faces of polygons to sample the texture map during rendering. Textures may be repeated or mirrored to extend a finite rectangular bitmap over a larger area, or they may have a one-to-one unique "<a href="Injective" class="mw-redirect" title="Injective">injective</a>" mapping from every piece of a surface (which is important for <a href="Render_mapping" class="mw-redirect" title="Render mapping">render mapping</a> and <a href="Light_mapping" class="mw-redirect" title="Light mapping">light mapping</a>, also known as <a href="Baking_(computer_graphics)" class="mw-redirect" title="Baking (computer graphics)">baking</a>).
</p>
<div class="mw-heading mw-heading4"><h4 id="Texture_space">Texture space</h4></div>
<p>Texture mapping maps the model surface (or <a href="Screen_space" class="mw-redirect" title="Screen space">screen space</a> during rasterization) into <i>texture space</i>; in this space, the texture map is visible in its undistorted form. <a href="UV_unwrapping" class="mw-redirect" title="UV unwrapping">UV unwrapping</a> tools typically provide a view in texture space for manual editing of texture coordinates. Some rendering techniques such as <a href="Subsurface_scattering" title="Subsurface scattering">subsurface scattering</a> may be performed approximately by texture-space operations.
</p>
<div class="mw-heading mw-heading3"><h3 id="Multitexturing">Multitexturing</h3></div>
<p>Multitexturing is the use of more than one texture at a time on a polygon.<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup> For instance, a <a href="Lightmap" title="Lightmap">light map</a> texture may be used to light a surface as an alternative to recalculating that lighting every time the surface is rendered. <i>Microtextures</i> or <i>detail textures</i> are used to add higher frequency details, and <i>dirt maps</i> add weathering and variation; this can greatly reduce the apparent periodicity of repeating textures. Modern graphics may use more than 10 layers, which are combined using <a href="Shaders" class="mw-redirect" title="Shaders">shaders</a>, for greater fidelity. Another multitexture technique is <a href="Bump_mapping" title="Bump mapping">bump mapping</a>, which allows a texture to directly control the facing direction of a surface for the purposes of its lighting calculations; it can give a very good appearance of a complex surface (such as tree bark or rough concrete) that takes on lighting detail in addition to the usual detailed coloring. Bump mapping has become popular in video games, as graphics hardware has become powerful enough to accommodate it in real-time.<sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Texture_filtering">Texture filtering</h3></div>
<p>The way that samples (e.g. when viewed as <a href="Pixel" title="Pixel">pixels</a> on the screen) are calculated from the <a href="Texel_(graphics)" title="Texel (graphics)">texels</a> (texture pixels) is governed by <a href="Texture_filtering" title="Texture filtering">texture filtering</a>. The cheapest method is to use the <a href="Nearest-neighbor_interpolation" title="Nearest-neighbor interpolation">nearest-neighbour interpolation</a>, but <a href="Bilinear_interpolation" title="Bilinear interpolation">bilinear interpolation</a> or <a href="Trilinear_interpolation" title="Trilinear interpolation">trilinear interpolation</a> between <a href="Mipmap" title="Mipmap">mipmaps</a> are two commonly used alternatives which reduce <a href="Aliasing" title="Aliasing">aliasing</a> or <a href="Jaggies" title="Jaggies">jaggies</a>. In the event of a texture coordinate being outside the texture, it is either <a href="Clamping_(graphics)" class="mw-redirect" title="Clamping (graphics)">clamped</a> or <a href="Wrapping_(graphics)" title="Wrapping (graphics)">wrapped</a>. <a href="Anisotropic_filtering" title="Anisotropic filtering">Anisotropic filtering</a> better eliminates directional artefacts when viewing textures from oblique viewing angles.
</p>
<div class="mw-heading mw-heading3"><h3 id="Texture_streaming">Texture streaming</h3></div>
<p>Texture streaming is a means of using <a href="Data_stream" title="Data stream">data streams</a> for textures, where each texture is available in two or more different resolutions, as to determine which texture should be loaded into memory and used based on draw distance from the viewer and how much memory is available for textures. Texture streaming allows a rendering engine to use low resolution textures for objects far away from the viewer's camera, and resolve those into more detailed textures, read from a data source, as the point of view nears the objects.
</p>
<div class="mw-heading mw-heading3"><h3 id="Baking">Baking</h3></div>
<p>As an optimization, it is possible to render detail from a complex, high-resolution model or expensive process (such as <a href="Global_illumination" title="Global illumination">global illumination</a>) into a surface texture (possibly on a low-resolution model). This technique is called <i>baking</i> (or <i>render mapping</i>) and is most commonly used for <a href="Lightmapping" class="mw-redirect" title="Lightmapping">light maps</a>, but may also be used to generate <a href="Normal_maps" class="mw-redirect" title="Normal maps">normal maps</a> and <a href="Displacement_maps" class="mw-redirect" title="Displacement maps">displacement maps</a>. Some computer games (e.g. <a href="Messiah_(video_game)" title="Messiah (video game)"><i>Messiah</i></a>) have used this technique. The original <a href="Quake_engine" title="Quake engine"><i>Quake</i> software engine</a> used on-the-fly baking to combine light maps and colour maps in a process called <i>surface caching</i>.
</p><p>Baking can be used as a form of <a href="Level_of_detail_(computer_graphics)" title="Level of detail (computer graphics)">level of detail</a> generation, where a complex scene with many different elements and materials may be approximated by a single element with a single texture, which is then algorithmically reduced for lower rendering cost and fewer <a href="Drawcalls" class="mw-redirect" title="Drawcalls">drawcalls</a>. It is also used to take high-detail models from <a href="3D_sculpting_software" class="mw-redirect" title="3D sculpting software">3D sculpting software</a> and <a href="Point_cloud_scanning" class="mw-redirect" title="Point cloud scanning">point cloud scanning</a> and approximate them with <a href="Meshes" class="mw-redirect" title="Meshes">meshes</a> more suitable for realtime rendering.
</p>
<div class="mw-heading mw-heading2"><h2 id="Rasterisation_algorithms">Rasterisation algorithms</h2></div>
<p>Various techniques have evolved in software and hardware implementations. Each offers different trade-offs in precision, versatility, and performance.
</p>
<div class="mw-heading mw-heading3"><h3 id="Affine_texture_mapping">Affine texture mapping</h3></div>

<p><b><span class="vanchor"><span class="vanchor-text">Affine texture mapping</span></span></b> linearly interpolates texture coordinates across a surface, making it the fastest form of texture mapping. Some software and hardware (such as the original <a href="PlayStation_(console)" title="PlayStation (console)">PlayStation</a>) <a href="3D_projection" title="3D projection">project</a> vertices in 3D space onto the screen during rendering and <a href="Linear_interpolation" title="Linear interpolation">linearly interpolate</a> the texture coordinates <i>in screen space</i> between them. This may be done by incrementing <a href="Fixed_point_arithmetic" class="mw-redirect" title="Fixed point arithmetic">fixed-point</a> <a href="UV_coordinates" class="mw-redirect" title="UV coordinates">UV coordinates</a> or by an <a href="Incremental_error_algorithm" class="mw-redirect" title="Incremental error algorithm">incremental error algorithm</a> akin to <a href="Bresenham's_line_algorithm" title="Bresenham's line algorithm">Bresenham's line algorithm</a>.
</p><p>In contrast to perpendicular polygons, this leads to noticeable distortion with perspective transformations (as shown in the figure: the checker box texture appears bent), especially as primitives near the <a href="3d_camera_coordinate_system" class="mw-redirect" title="3d camera coordinate system">camera</a>. This distortion can be reduced by subdividing polygons into smaller polygons.
</p><p>Using quad primitives for rectangular objects can look less incorrect than if those rectangles were split into triangles. However, since interpolating four points adds complexity to the rasterization, most early implementations preferred triangles only. Some hardware, such as the <a href="#Forward_texture_mapping">forward texture mapping</a> used by the Nvidia <a href="NV1" title="NV1">NV1</a>, offered efficient quad primitives. With perspective correction, triangles become equivalent to quad primitives and this advantage disappears.
</p>

<p>For rectangular objects that are at right angles to the viewer (like floors and walls), the perspective only needs to be corrected in one direction across the screen rather than both. The correct perspective mapping can be calculated at the left and right edges of the floor. Affine linear interpolation across that horizontal span will look correct because every pixel along that line is the same distance from the viewer.
</p>
<div class="mw-heading mw-heading3"><h3 id="Perspective_correctness">Perspective correctness</h3></div>
<p><b><span class="vanchor"><span class="vanchor-text">Perspective correct texturing</span></span></b> accounts for the vertices' positions in 3D space rather than simply interpolating coordinates in 2D screen space.<sup id="cite_ref-NGen15_11-0" class="reference"><a href="#cite_note-NGen15-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> While achieving the correct visual effect, perspective correct texturing is more expensive to calculate.<sup id="cite_ref-NGen15_11-1" class="reference"><a href="#cite_note-NGen15-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p><p>To perform perspective correction of the texture coordinates <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>u</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u}</annotation>
</semantics>
</math></span><img src="./c3e6bb763d22c20916ed4f0bb6bd49d7470cffd8.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.33ex; height:1.676ex;" alt="{\displaystyle u}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>v</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v}</annotation>
</semantics>
</math></span><img src="./e07b00e7fc0847fbd16391c778d65bc25c452597.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.128ex; height:1.676ex;" alt="{\displaystyle v}" loading="lazy"></span>, with <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z}</annotation>
</semantics>
</math></span><img src="./bf368e72c009decd9b6686ee84a375632e11de98.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.088ex; height:1.676ex;" alt="{\displaystyle z}" loading="lazy"></span> being the depth component from the viewer's point of view, it is possible to take advantage of the fact that the values <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{z}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mi>z</mi>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {1}{z}}}</annotation>
</semantics>
</math></span><img src="./b79eb578155d9e7baf1303e9e63044aa4c3ec6fd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.838ex; width:1.999ex; height:5.176ex;" alt="{\displaystyle {\frac {1}{z}}}" loading="lazy"></span>, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {u}{z}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>u</mi>
<mi>z</mi>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {u}{z}}}</annotation>
</semantics>
</math></span><img src="./69260880f02fe965f7c89b72ff83567c9079a41f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.838ex; width:2.166ex; height:4.676ex;" alt="{\displaystyle {\frac {u}{z}}}" loading="lazy"></span>, and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {v}{z}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>v</mi>
<mi>z</mi>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {v}{z}}}</annotation>
</semantics>
</math></span><img src="./cd9e014b0405ef3b73322df38ad7eee987786ff7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.838ex; width:1.964ex; height:4.676ex;" alt="{\displaystyle {\frac {v}{z}}}" loading="lazy"></span> are linear in screen space across the surface being textured. In contrast, the original <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z}</annotation>
</semantics>
</math></span><img src="./bf368e72c009decd9b6686ee84a375632e11de98.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.088ex; height:1.676ex;" alt="{\displaystyle z}" loading="lazy"></span>, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>u</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u}</annotation>
</semantics>
</math></span><img src="./c3e6bb763d22c20916ed4f0bb6bd49d7470cffd8.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.33ex; height:1.676ex;" alt="{\displaystyle u}" loading="lazy"></span>, and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>v</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v}</annotation>
</semantics>
</math></span><img src="./e07b00e7fc0847fbd16391c778d65bc25c452597.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.128ex; height:1.676ex;" alt="{\displaystyle v}" loading="lazy"></span>, before the division, are not linear across the surface in screen space. It is therefore possible to linearly interpolate these reciprocals across the surface, computing corrected values at each pixel, to produce a perspective correct texture mapping.
</p><p>To do this, the reciprocals at each vertex of the geometry (three points for a triangle) are calculated. Vertex <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n}</annotation>
</semantics>
</math></span><img src="./a601995d55609f2d9f5e233e36fbe9ea26011b3b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.395ex; height:1.676ex;" alt="{\displaystyle n}" loading="lazy"></span> has reciprocals <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {u_{n}}{z_{n}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {u_{n}}{z_{n}}}}</annotation>
</semantics>
</math></span><img src="./f4e8556922ee511e1768bc4f948e26093fd114b7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.171ex; width:3.384ex; height:5.009ex;" alt="{\displaystyle {\frac {u_{n}}{z_{n}}}}" loading="lazy"></span>, <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {v_{n}}{z_{n}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {v_{n}}{z_{n}}}}</annotation>
</semantics>
</math></span><img src="./96c953f0ab8cfcd2c050424aa60536ae241f086f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.171ex; width:3.182ex; height:5.009ex;" alt="{\displaystyle {\frac {v_{n}}{z_{n}}}}" loading="lazy"></span>, and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{z_{n}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {1}{z_{n}}}}</annotation>
</semantics>
</math></span><img src="./450d0ea82d5d4e5fd1fb00a28c7baa6708ba581a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.171ex; width:3.136ex; height:5.509ex;" alt="{\displaystyle {\frac {1}{z_{n}}}}" loading="lazy"></span>. Then, linear interpolation can be done on these reciprocals between the <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle n}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>n</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle n}</annotation>
</semantics>
</math></span><img src="./a601995d55609f2d9f5e233e36fbe9ea26011b3b.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.395ex; height:1.676ex;" alt="{\displaystyle n}" loading="lazy"></span> vertices (e.g., using <a href="Barycentric_coordinates" class="mw-redirect" title="Barycentric coordinates">barycentric coordinates</a>), resulting in interpolated values across the surface. At a given point, this yields the interpolated <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{i},v_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{i},v_{i}}</annotation>
</semantics>
</math></span><img src="./a0ba6db805ac569f88ed7ada731e1284512083ec.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:5.091ex; height:2.009ex;" alt="{\displaystyle u_{i},v_{i}}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{z_{i}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {1}{z_{i}}}}</annotation>
</semantics>
</math></span><img src="./400a29e6f8c42473cf7b5fdfe12c7e79167ee786.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.171ex; width:2.717ex; height:5.509ex;" alt="{\displaystyle {\frac {1}{z_{i}}}}" loading="lazy"></span> (reciprocal <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z_{i}}</annotation>
</semantics>
</math></span><img src="./5c6e920bac39ad09fff4efef16254595091a1025.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:1.881ex; height:2.009ex;" alt="{\displaystyle z_{i}}" loading="lazy"></span>). However, as our division by <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z}</annotation>
</semantics>
</math></span><img src="./bf368e72c009decd9b6686ee84a375632e11de98.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.088ex; height:1.676ex;" alt="{\displaystyle z}" loading="lazy"></span> altered their coordinate system, this <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{i},v_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{i},v_{i}}</annotation>
</semantics>
</math></span><img src="./a0ba6db805ac569f88ed7ada731e1284512083ec.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:5.091ex; height:2.009ex;" alt="{\displaystyle u_{i},v_{i}}" loading="lazy"></span> cannot be used as texture coordinates. To correct back to the <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u,v}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>u</mi>
<mo>,</mo>
<mi>v</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u,v}</annotation>
</semantics>
</math></span><img src="./7e66f4b32a0181923cc1337a5634f38241e5c697.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:3.491ex; height:2.009ex;" alt="{\displaystyle u,v}" loading="lazy"></span> space, the corrected <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z}</annotation>
</semantics>
</math></span><img src="./bf368e72c009decd9b6686ee84a375632e11de98.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.088ex; height:1.676ex;" alt="{\displaystyle z}" loading="lazy"></span> is calculated by taking the reciprocal once again: <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z_{correct}={\frac {1}{\frac {1}{z_{i}}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>c</mi>
<mi>o</mi>
<mi>r</mi>
<mi>r</mi>
<mi>e</mi>
<mi>c</mi>
<mi>t</mi>
</mrow>
</msub>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mfrac>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z_{correct}={\frac {1}{\frac {1}{z_{i}}}}}</annotation>
</semantics>
</math></span><img src="./50d459db3667892c8d78d5414bb9138309443229.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.505ex; width:12.538ex; height:6.843ex;" alt="{\displaystyle z_{correct}={\frac {1}{\frac {1}{z_{i}}}}}" loading="lazy"></span>. This is then used to correct the <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{i},v_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>,</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{i},v_{i}}</annotation>
</semantics>
</math></span><img src="./a0ba6db805ac569f88ed7ada731e1284512083ec.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:5.091ex; height:2.009ex;" alt="{\displaystyle u_{i},v_{i}}" loading="lazy"></span> coordinates: <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{correct}=u_{i}\cdot z_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>c</mi>
<mi>o</mi>
<mi>r</mi>
<mi>r</mi>
<mi>e</mi>
<mi>c</mi>
<mi>t</mi>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>⋅<!-- ⋅ --></mo>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{correct}=u_{i}\cdot z_{i}}</annotation>
</semantics>
</math></span><img src="./58bb099b11b15df6e724e384e5aeaa4ea6bddc2a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:15.414ex; height:2.009ex;" alt="{\displaystyle u_{correct}=u_{i}\cdot z_{i}}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle v_{correct}=v_{i}\cdot z_{i}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>c</mi>
<mi>o</mi>
<mi>r</mi>
<mi>r</mi>
<mi>e</mi>
<mi>c</mi>
<mi>t</mi>
</mrow>
</msub>
<mo>=</mo>
<msub>
<mi>v</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
<mo>⋅<!-- ⋅ --></mo>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle v_{correct}=v_{i}\cdot z_{i}}</annotation>
</semantics>
</math></span><img src="./5677d89b15f2fd35b40d9abb839b5ebe08d9d4ca.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:15.01ex; height:2.009ex;" alt="{\displaystyle v_{correct}=v_{i}\cdot z_{i}}" loading="lazy"></span>.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p>This correction makes it so that the difference from pixel to pixel between texture coordinates is smaller in parts of the polygon that are closer to the viewer (stretching the texture wider) and is larger in parts that are farther away (compressing the texture).
</p><p>Affine texture mapping directly interpolates a texture coordinate <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{\alpha }}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>α<!-- α --></mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{\alpha }}</annotation>
</semantics>
</math></span><img src="./7cab073df38efb76e79a2d02e09f7f54bfc30a5d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.614ex; height:2.009ex;" alt="{\displaystyle u_{\alpha }}" loading="lazy"></span> between two endpoints <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{0}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{0}}</annotation>
</semantics>
</math></span><img src="./9c7425f9c7ab645587060423c0af62f8a61fbc65.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.384ex; height:2.009ex;" alt="{\displaystyle u_{0}}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{1}}</annotation>
</semantics>
</math></span><img src="./69b0c788a124a32684f109737f7cfab7611d6a58.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:2.384ex; height:2.009ex;" alt="{\displaystyle u_{1}}" loading="lazy"></span>:
<span class="mwe-math-element mwe-math-element-block"><span class="mwe-math-mathml-display mwe-math-mathml-a11y" style="display: none;"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{\alpha }=(1-\alpha )u_{0}+\alpha u_{1}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>α<!-- α --></mi>
</mrow>
</msub>
<mo>=</mo>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>α<!-- α --></mi>
<mo stretchy="false">)</mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
<mo>+</mo>
<mi>α<!-- α --></mi>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{\alpha }=(1-\alpha )u_{0}+\alpha u_{1}}</annotation>
</semantics>
</math></span></span>
where <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 0\leq \alpha \leq 1}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>0</mn>
<mo>≤<!-- ≤ --></mo>
<mi>α<!-- α --></mi>
<mo>≤<!-- ≤ --></mo>
<mn>1</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 0\leq \alpha \leq 1}</annotation>
</semantics>
</math></span><img src="./9184b6c2088ccc2e9ac06bfb0964e264c9f6ba53.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:10.009ex; height:2.343ex;" alt="{\displaystyle 0\leq \alpha \leq 1}" loading="lazy"></span>.
</p><p>Perspective correct mapping interpolates after dividing by depth <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle z}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>z</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle z}</annotation>
</semantics>
</math></span><img src="./bf368e72c009decd9b6686ee84a375632e11de98.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.088ex; height:1.676ex;" alt="{\displaystyle z}" loading="lazy"></span>, then uses its interpolated reciprocal to recover the correct coordinate:
<span class="mwe-math-element mwe-math-element-block"><span class="mwe-math-mathml-display mwe-math-mathml-a11y" style="display: none;"><math display="block" xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle u_{\alpha }={\frac {(1-\alpha ){\frac {u_{0}}{z_{0}}}+\alpha {\frac {u_{1}}{z_{1}}}}{(1-\alpha ){\frac {1}{z_{0}}}+\alpha {\frac {1}{z_{1}}}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>α<!-- α --></mi>
</mrow>
</msub>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>α<!-- α --></mi>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
</mfrac>
</mrow>
<mo>+</mo>
<mi>α<!-- α --></mi>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mfrac>
</mrow>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>α<!-- α --></mi>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>0</mn>
</mrow>
</msub>
</mfrac>
</mrow>
<mo>+</mo>
<mi>α<!-- α --></mi>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
</mfrac>
</mrow>
</mrow>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle u_{\alpha }={\frac {(1-\alpha ){\frac {u_{0}}{z_{0}}}+\alpha {\frac {u_{1}}{z_{1}}}}{(1-\alpha ){\frac {1}{z_{0}}}+\alpha {\frac {1}{z_{1}}}}}}</annotation>
</semantics>
</math></span></span>3D graphics hardware typically supports perspective correct texturing.
</p><p>Various techniques have evolved for rendering texture mapped geometry into images with different quality and precision trade-offs, which can be applied to both software and hardware.
</p><p>Classic software texture mappers generally only performed simple texture mapping with one lighting effect at most (typically applied through a <a href="Lookup_table" title="Lookup table">lookup table</a>), and the perspective correctness was about 16 times more expensive.
</p>
<div class="mw-heading mw-heading3"><h3 id="Restricted_camera_rotation">Restricted camera rotation</h3></div>

<p>The <a href="Doom_engine" title="Doom engine"><i>Doom</i> engine</a> restricted the world to vertical walls and horizontal floors and ceilings, with a camera that could only rotate about the vertical axis. This meant the walls would be a constant depth coordinate along a vertical line and the floors and ceilings would have a constant depth along a horizontal line. After performing one perspective correction calculation for the depth, the rest of the line could use fast affine mapping. Some later renderers of this era simulated a small amount of camera <a href="Pitch_(orientation)" class="mw-redirect" title="Pitch (orientation)">pitch</a> with <a href="Shear_(transformation)" class="mw-redirect" title="Shear (transformation)">shearing</a> which allowed the appearance of greater freedom while using the same rendering technique.
</p><p>Some engines were able to render texture mapped <a href="Heightmaps" class="mw-redirect" title="Heightmaps">heightmaps</a> (e.g. <a href="Nova_Logic" class="mw-redirect" title="Nova Logic">Nova Logic</a>'s <a href="Voxel_Space" title="Voxel Space">Voxel Space</a>, and the engine for <a href="Outcast_(video_game)" title="Outcast (video game)"><i>Outcast</i></a>) via <a href="Bresenham's_line_algorithm" title="Bresenham's line algorithm">Bresenham</a>-like incremental algorithms, producing the appearance of a texture mapped landscape without the use of traditional geometric primitives.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Subdivision_for_perspective_correction">Subdivision for perspective correction</h3></div>
<p>Every triangle can be further subdivided into groups of about 16 pixels in order to achieve two goals: keeping the arithmetic mill busy at all times and producing faster arithmetic results.
</p>
<div class="mw-heading mw-heading4"><h4 id="World_space_subdivision">World space subdivision</h4></div>
<p>For perspective texture mapping without hardware support, a triangle is broken down into smaller triangles for rendering and affine mapping is used on them. The reason this technique works is that the distortion of affine mapping becomes much less noticeable on smaller polygons. The <a href="Sony_PlayStation" class="mw-redirect" title="Sony PlayStation">Sony PlayStation</a> made extensive use of this because it only supported affine mapping in hardware and had a relatively high triangle throughput compared to its peers.
</p>
<div class="mw-heading mw-heading4"><h4 id="Screen_space_subdivision">Screen space subdivision</h4></div>

<p>Software renderers generally prefer screen subdivision because it has less overhead. Additionally, they try to do linear interpolation along a line of pixels to simplify the set-up (compared to 2D affine interpolation), thus lessening the overhead further. Another reason is that affine texture mapping does not fit into the low number of <a href="CPU_register" class="mw-redirect" title="CPU register">CPU registers</a> of the <a href="X86" title="X86">x86</a> CPU; the <a href="68000" class="mw-redirect" title="68000">68000</a> and <a href="RISC" class="mw-redirect" title="RISC">RISC</a> processors are much more suited for that approach.
</p><p>A different approach was taken for <i><a href="Quake_(video_game)" title="Quake (video game)">Quake</a></i>, which would calculate perspective correct coordinates only once every 16 pixels of a scanline and linearly interpolate between them, effectively running at the speed of linear interpolation because the perspective correct calculation runs in parallel on the co-processor.<sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup> As the polygons are rendered independently, it may be possible to switch between spans and columns or diagonal directions depending on the orientation of the <a href="Polygon_normal" class="mw-redirect" title="Polygon normal">polygon normal</a> to achieve a more constant z, but the effort seems not to be worth it.
</p>
<div class="mw-heading mw-heading4"><h4 id="Other_techniques">Other techniques</h4></div>
<p>One other technique is to approximate the perspective with a faster calculation, such as a polynomial. A second uses the <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\textstyle {\frac {1}{z_{i}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="false" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msub>
<mi>z</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>i</mi>
</mrow>
</msub>
</mfrac>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\textstyle {\frac {1}{z_{i}}}}</annotation>
</semantics>
</math></span><img src="./adf4af92fa836f158e91ac509a8de553766bb92a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.338ex; width:2.226ex; height:3.676ex;" alt="{\textstyle {\frac {1}{z_{i}}}}" loading="lazy"></span> value of the last two drawn pixels to linearly extrapolate the next value. For the latter, the division is then done starting from those values so that all that has to be divided is a small remainder.<sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> However, the amount of bookkeeping needed makes this technique too slow on most systems.
</p><p>A third technique, used by the <a href="Build_Engine" class="mw-redirect" title="Build Engine">Build Engine</a> (used, most notably, in <i><a href="Duke_Nukem_3D" title="Duke Nukem 3D">Duke Nukem 3D</a></i>), builds on the constant distance trick used by the <i>Doom</i> engine by finding and rendering along the line of constant distance for arbitrary polygons.
</p>
<div class="mw-heading mw-heading3"><h3 id="Hardware_implementations">Hardware implementations</h3></div>
<p>Texture mapping hardware was originally developed for simulation (e.g. as implemented in the <a href="Evans_and_Sutherland" class="mw-redirect" title="Evans and Sutherland">Evans and Sutherland</a> ESIG and Singer-Link Digital Image Generators DIG) and professional <a href="Graphics_workstation" class="mw-redirect" title="Graphics workstation">graphics workstations</a> (such as <a href="Silicon_Graphics" title="Silicon Graphics">Silicon Graphics</a>) and broadcast <a href="Digital_video_effect" title="Digital video effect">digital video effects</a> machines such as the <a href="Ampex_ADO" class="mw-redirect" title="Ampex ADO">Ampex ADO</a>. Texture mapping hardware later appeared in <a href="Arcade_cabinet" title="Arcade cabinet">arcade cabinets</a>, consumer <a href="Video_game_console" title="Video game console">video game consoles</a>, and PC <a href="Video_card" class="mw-redirect" title="Video card">video cards</a> in the mid-1990s.
</p><p>In <a href="Flight_simulation" class="mw-redirect" title="Flight simulation">flight simulations</a>, texture mapping provided important motion and altitude cues necessary for pilot training not available on untextured surfaces. Additionally, texture mapping was implemented so that real-time processing of prefiltered texture patterns stored in memory could be accessed by the video processor in real-time.<sup id="cite_ref-16" class="reference"><a href="#cite_note-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>
</p><p>Modern <a href="Graphics_processing_unit" title="Graphics processing unit">graphics processing units</a> (GPUs) provide specialised <a href="Fixed_function_unit" class="mw-redirect" title="Fixed function unit">fixed function units</a> called <i>texture samplers</i>, or <i><a href="Texture_mapping_unit" title="Texture mapping unit">texture mapping units</a></i>, to perform texture mapping, usually with <a href="Trilinear_filtering" title="Trilinear filtering">trilinear filtering</a> or better multi-tap <a href="Anisotropic_filtering" title="Anisotropic filtering">anisotropic filtering</a> and hardware for decoding specific formats such as <a href="DXTn" class="mw-redirect" title="DXTn">DXTn</a>. As of 2016, texture mapping hardware is ubiquitous as most <a href="System_on_a_chip" title="System on a chip">SOCs</a> contain a suitable GPU.
</p><p>Some hardware implementations combine texture mapping with <a href="Hidden-surface_determination" title="Hidden-surface determination">hidden-surface determination</a> in <a href="Tile-based_deferred_rendering" class="mw-redirect" title="Tile-based deferred rendering">tile-based deferred rendering</a> or <a href="Scanline_rendering" title="Scanline rendering">scanline rendering</a>; such systems only fetch the visible <a href="Texels" class="mw-redirect" title="Texels">texels</a> at the expense of using greater workspace for transformed vertices. Most systems have settled on the <a href="Z-buffering" title="Z-buffering">z-buffering</a> approach, which can still reduce the texture mapping workload with front-to-back <a href="Sorting_algorithm" title="Sorting algorithm">sorting</a>.
</p><p>On earlier graphics hardware, there were two competing paradigms of how to deliver a texture to the screen:
</p>
<ol><li>Forward texture mapping iterates through each texel on the texture and decides where to place it on the screen.</li>
<li>Inverse texture mapping instead iterates through pixels on the screen and decides what texel to use for each.</li></ol>
<p>Of these methods, inverse texture mapping has become standard in modern hardware.
</p>
<div class="mw-heading mw-heading4"><h4 id="Inverse_texture_mapping">Inverse texture mapping</h4></div>
<p>With this method, a pixel on the screen is mapped to a point on the texture. Each vertex of a <a href="Rendering_primitive" class="mw-redirect" title="Rendering primitive">rendering primitive</a> is projected to a point on the screen, and each of these points is <a href="UV_mapping" title="UV mapping">mapped to a u,v texel coordinate</a> on the texture. A rasterizer will interpolate between these points to fill in each pixel covered by the primitive.
</p><p>The primary advantage of this method is that each pixel covered by a primitive will be traversed exactly once. Once a primitive's vertices are transformed, the amount of remaining work scales directly with how many pixels it covers on the screen.
</p><p>The main disadvantage is that the <a href="Memory_access_pattern" title="Memory access pattern">memory access pattern</a> in the <a href="Texture_space" class="mw-redirect" title="Texture space">texture space</a> will not be linear if the texture is at an angle to the screen. This disadvantage is often addressed by <a href="Texture_cache" class="mw-redirect" title="Texture cache">texture caching</a> techniques, such as the <a href="Swizzled_texture" class="mw-redirect" title="Swizzled texture">swizzled texture</a> memory arrangement.
</p><p>The linear interpolation can be used directly for simple and efficient <a href="#Affine_texture_mapping">affine texture mapping</a>, but can also be adapted for <a href="#Perspective_correctness">perspective correctness</a>.
</p>
<div class="mw-heading mw-heading4"><h4 id="Forward_texture_mapping">Forward texture mapping</h4></div>
<p>Forward texture mapping maps each texel of the texture to a pixel on the screen. After transforming a rectangular primitive to a place on the screen, a forward texture mapping renderer iterates through each texel on the texture, <a href="Texture_splatting" title="Texture splatting">splatting</a> each one onto a pixel of the <a href="Frame_buffer" class="mw-redirect" title="Frame buffer">frame buffer</a>. This was used by some hardware, such as the <a href="3DO" title="3DO">3DO</a>, the <a href="Sega_Saturn" title="Sega Saturn">Sega Saturn</a> and the <a href="NV1" title="NV1">NV1</a>.
</p><p>The primary advantage is that the texture will be accessed in a simple linear order, allowing very efficient caching of the texture data. However, this benefit is also its disadvantage: as a primitive gets smaller on screen, it still has to iterate over every texel in the texture, causing many pixels to be overdrawn redundantly.
</p><p>This method is also well suited for rendering quad primitives rather than reducing them to triangles, which provided an advantage when perspective correct texturing was not available in hardware. This is because the affine distortion of a quad looks less incorrect than the same quad split into two triangles <style data-mw-deduplicate="TemplateStyles:r1033199720">
/* start https://en.wikipedia.org/ */


.mw-parser-output div.crossreference{padding-left:0}


/* end https://en.wikipedia.org/ */
</style><span role="note" class="hatnote navigation-not-searchable crossreference selfref">(see the <a href="#Affine_texture_mapping">§&nbsp;Affine texture mapping</a> section above)</span>. The NV1 hardware also allowed a quadratic interpolation mode to provide an even better approximation of perspective correctness.
</p><p><a href="UV_mapping" title="UV mapping">UV mapping</a> became an important technique for 3D modelling and assisted in <a href="Clipping_(computer_graphics)" title="Clipping (computer graphics)">clipping</a> the texture correctly when the primitive went past the edge of the screen, but existing hardware did not provide effective implementations of this. These shortcomings could have been addressed with further development, but GPU design has mostly shifted toward using the inverse mapping technique.
</p>
<div style="clear:both;" class=""></div>
<div class="mw-heading mw-heading2"><h2 id="Applications">Applications</h2></div>
<p>Beyond 3D rendering, the availability of texture mapping hardware has inspired its use for accelerating other tasks:
</p>
<div class="mw-heading mw-heading3"><h3 id="Tomography">Tomography</h3></div>
<p>It is possible to use texture mapping hardware to accelerate both the <a href="Tomographic_reconstruction" title="Tomographic reconstruction">reconstruction</a> of <a href="Voxel" title="Voxel">voxel</a> data sets from <a href="Tomography" title="Tomography">tomographic scans</a>, and to <a href="Volume_rendering" title="Volume rendering">visualize the results</a>.<sup id="cite_ref-17" class="reference"><a href="#cite_note-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="User_interfaces">User interfaces</h3></div>
<p>Many user interfaces use texture mapping to accelerate animated transitions of screen elements, e.g. <a href="Mission_Control_(macOS)" title="Mission Control (macOS)">Exposé</a> in <a href="Mac_OS_X" class="mw-redirect" title="Mac OS X">Mac OS X</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="2.5D" title="2.5D">2.5D</a></li>
<li><a href="3D_computer_graphics" title="3D computer graphics">3D computer graphics</a></li>
<li><a href="Mipmap" title="Mipmap">Mipmap</a></li>
<li><a href="Materials_system" class="mw-redirect" title="Materials system">Materials system</a></li>
<li><a href="Parametrization_(geometry)" title="Parametrization (geometry)">Parametrization</a></li>
<li><a href="Texture_synthesis" title="Texture synthesis">Texture synthesis</a></li>
<li><a href="Texture_atlas" title="Texture atlas">Texture atlas</a></li>
<li><a href="Texture_splatting" title="Texture splatting">Texture splatting</a> – a technique for combining textures</li>
<li><a href="Shader_(computer_graphics)" class="mw-redirect" title="Shader (computer graphics)">Shader (computer graphics)</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist reflist-columns references-column-width" style="column-width: 30em;">
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFWang" class="citation web cs1">Wang, Huamin. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20160304074441/http://web.cse.ohio-state.edu/~whmin/courses/cse5542-2013-spring/15-texture.pdf">"Texture Mapping"</a> <span class="cs1-format">(PDF)</span>. <i>department of Computer Science and Engineering</i>. <a href="Ohio_State_University" title="Ohio State University">Ohio State University</a>. Archived from <a rel="nofollow" class="external text" href="http://web.cse.ohio-state.edu/~whmin/courses/cse5542-2013-spring/15-texture.pdf">the original</a> <span class="cs1-format">(PDF)</span> on 2016-03-04<span class="reference-accessdate">. Retrieved <span class="nowrap">2016-01-15</span></span>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.inf.pucrs.br/flash/tcg/aulas/texture/texmap.pdf">"Texture Mapping"</a> <span class="cs1-format">(PDF)</span>. <i>www.inf.pucrs.br</i><span class="reference-accessdate">. Retrieved <span class="nowrap">September 15,</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.cs.uregina.ca/Links/class-info/405/WWW/Lab5/#References">"CS 405 Texture Mapping"</a>. <i>www.cs.uregina.ca</i><span class="reference-accessdate">. Retrieved <span class="nowrap">22 March</span> 2018</span>.</cite></span>
</li>
<li id="cite_note-Catmull_thesis-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-Catmull_thesis_4-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFCatmull1974" class="citation thesis cs1"><a href="Edwin_Catmull" title="Edwin Catmull">Catmull, E.</a> (1974). <a rel="nofollow" class="external text" href="http://www.pixartouchbook.com/storage/catmull_thesis.pdf"><i>A subdivision algorithm for computer display of curved surfaces</i></a> <span class="cs1-format">(PDF)</span> (PhD thesis). University of Utah.</cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite id="CITEREFFosner1999" class="citation web cs1">Fosner, Ron (January 1999). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20161031110040/http://www.microsoft.com/msj/0199/direct3d/direct3d.aspx">"DirectX 6.0 Goes Ballistic With Multiple New Features And Much Faster Code"</a>. <i>Microsoft.com</i>. Archived from <a rel="nofollow" class="external text" href="http://www.microsoft.com/msj/0199/direct3d/direct3d.aspx">the original</a> on October 31, 2016<span class="reference-accessdate">. Retrieved <span class="nowrap">September 15,</span> 2019</span>.</cite></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite id="CITEREFHvidsten2004" class="citation web cs1">Hvidsten, Mike (Spring 2004). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20190523063623/http://homepages.gac.edu/~hvidsten/courses/MC394/projects/project5/texture_map_guide.html">"The OpenGL Texture Mapping Guide"</a>. <i>homepages.gac.edu</i>. Archived from <a rel="nofollow" class="external text" href="http://homepages.gac.edu/~hvidsten/courses/MC394/projects/project5/texture_map_guide.html">the original</a> on 23 May 2019<span class="reference-accessdate">. Retrieved <span class="nowrap">22 March</span> 2018</span>.</cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text">Jon Radoff, Anatomy of an MMORPG, <cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://radoff.com/blog/2008/08/22/anatomy-of-an-mmorpg/">"Anatomy of an MMORPG"</a>. <i>radoff.com</i>. August 22, 2008. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20091213053756/http://radoff.com/blog/2008/08/22/anatomy-of-an-mmorpg/">Archived</a> from the original on 2009-12-13<span class="reference-accessdate">. Retrieved <span class="nowrap">2009-12-13</span></span>.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite id="CITEREFRoberts" class="citation web cs1 cs1-prop-unfit">Roberts, Susan. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20210924034033/https://freeassetsunity.com/how-to-use-textures/">"How to use textures"</a>. Archived from the original on 24 September 2021<span class="reference-accessdate">. Retrieved <span class="nowrap">20 March</span> 2021</span>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text">Blythe, David. <i><a rel="nofollow" class="external text" href="https://web.archive.org/web/20200228185024/https://pdfs.semanticscholar.org/fc76/bb3649978a1939d9bd9d9d3769f47ebfc6c1.pdf">Advanced Graphics Programming Techniques Using OpenGL</a>.</i> Siggraph 1999. (<a href="PDF" title="PDF">PDF</a>) (see: <a rel="nofollow" class="external text" href="https://web.archive.org/web/20120108033621/http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node60.html">Multitexture</a>)</span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20150914190914/http://web4.cs.ucl.ac.uk/staff/j.kautz/publications/rtbumpmapHWWS01.pdf">Real-Time Bump Map Synthesis</a>, Jan Kautz<sup>1</sup>, Wolfgang Heidrichy<sup>2</sup> and Hans-Peter Seidel<sup>1</sup>, (<sup>1</sup>Max-Planck-Institut für Informatik, <sup>2</sup>University of British Columbia)</span>
</li>
<li id="cite_note-NGen15-11"><span class="mw-cite-backlink">^ <a href="#cite_ref-NGen15_11-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-NGen15_11-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite class="citation magazine cs1"><a rel="nofollow" class="external text" href="https://archive.org/details/nextgen-issue-015/page/n39/mode/2up">"The Next Generation 1996 Lexicon A to Z: Perspective Correction"</a>. <i><a href="Next_Generation_(magazine)" title="Next Generation (magazine)">Next Generation</a></i>. No.&nbsp;15. <a href="Imagine_Media" class="mw-redirect" title="Imagine Media">Imagine Media</a>. March 1996. p.&nbsp;38.</cite></span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><cite id="CITEREFKalms1997" class="citation web cs1">Kalms, Mikael (1997). <a rel="nofollow" class="external text" href="http://www.lysator.liu.se/~mikaelk/doc/perspectivetexture/">"Perspective Texturemapping"</a>. <i>www.lysator.liu.se</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2020-03-27</span></span>.</cite></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text">"<a rel="nofollow" class="external text" href="https://web.archive.org/web/20131113094653/http://www.codermind.com/articles/Voxel-terrain-engine-building-the-terrain.html">Voxel terrain engine</a>", introduction. In a coder's mind, 2005 (archived 2013).</span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text">Abrash, Michael. <i>Michael Abrash's Graphics Programming Black Book Special Edition.</i> The Coriolis Group, Scottsdale Arizona, 1997. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>1-57610-174-6</bdi> (<a rel="nofollow" class="external text" href="http://www.gamedev.net/reference/articles/article1698.asp">PDF</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20070311022026/http://www.gamedev.net/reference/articles/article1698.asp">Archived</a> 2007-03-11 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a>) (Chapter 70, pg. 1282)</span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1041539562">
/* start https://en.wikipedia.org/ */


.mw-parser-output .citation{word-wrap:break-word}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}


/* end https://en.wikipedia.org/ */
</style><span class="citation patent" id="CITEREFSpackman1998"><a rel="nofollow" class="external text" href="https://worldwide.espacenet.com/textdoc?DB=EPODOC&amp;IDX=US5739818">US 5739818</a>, Spackman, John Neil, "Apparatus and method for performing perspectively correct interpolation in computer graphics", issued 1998-04-14</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Apatent&amp;rft.number=5739818&amp;rft.cc=US&amp;rft.title=Apparatus+and+method+for+performing+perspectively+correct+interpolation+in+computer+graphics&amp;rft.inventor=Spackman&amp;rft.date=1998-04-14"><span style="display: none;">&nbsp;</span></span></span>
</li>
<li id="cite_note-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-16">^</a></b></span> <span class="reference-text"><cite id="CITEREFYan1985" class="citation journal cs1">Yan, Johnson (August 1985). "Advances in Computer-Generated Imagery for Flight Simulation". <i>IEEE Computer Graphics and Applications</i>. <b>5</b> (8): <span class="nowrap">37–</span>51. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FMCG.1985.276213">10.1109/MCG.1985.276213</a>.</cite></span>
</li>
<li id="cite_note-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-17">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://patents.google.com/patent/US6002738">"texture mapping for tomography"</a>.</cite></span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="Software">Software</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.gcc.tu-darmstadt.de/home/proj/texrecon/index.en.jsp">TexRecon</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20211127121726/https://www.gcc.tu-darmstadt.de/home/proj/texrecon/index.en.jsp">Archived</a> 2021-11-27 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> – open-source software for texturing 3D models written in C++</li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.decew.net/OSS/References/chapter_2_texture_mapping.pdf">Introduction into texture mapping using C and SDL</a> (PDF)</li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20190103234143/http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/Textured_terrain.php">Programming a textured terrain</a> using XNA/DirectX, from www.riemers.net</li>
<li><a rel="nofollow" class="external text" href="http://www.gamers.org/dEngine/quake/papers/checker_texmap.html">Perspective correct texturing</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20071226193904/http://www.fawzma.com/time-texturing-texture-mapping-with-bezier-lines/">Time Texturing</a> – texture mapping with bezier lines</li>
<li><a rel="nofollow" class="external text" href="http://www.hpl.hp.com/research/ptm/">Polynomial Texture Mapping</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20190307055738/http://www.hpl.hp.com/research/ptm/">Archived</a> 2019-03-07 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> – Interactive Relighting for Photos</li>
<li><a rel="nofollow" class="external text" href="http://www.um.es/geograf/sigmur/temariohtml/node43_ct.html">3 Métodos de interpolación a partir de puntos (in Spanish)</a> – texture interpolation methods used when the texture coords at polygon vertices are known</li>
<li><a rel="nofollow" class="external text" href="https://cgifurniture.com/3d-texturing-tools-top-10/">3D Texturing Tools</a></li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */


.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}


/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}


/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Texture_mapping_techniques62" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */


.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}


/* end https://en.wikipedia.org/ */
</style><div id="Texture_mapping_techniques62" style="font-size:114%;margin:0 4em"></div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Local</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Displacement_mapping" title="Displacement mapping">Displacement mapping</a></li>
<li><a href="Normal_mapping" title="Normal mapping">Normal mapping</a></li>
<li><a href="Parallax_mapping" title="Parallax mapping">Parallax mapping</a></li>
<li><a href="UV_mapping" title="UV mapping">UV mapping</a></li>
<li><a href="UVW_mapping" title="UVW mapping">UVW mapping</a></li>
<li><a href="Relief_mapping_(computer_graphics)" title="Relief mapping (computer graphics)"> Relief mapping</a></li>
<li><a href="Alpha_mapping" title="Alpha mapping">Alpha mapping</a></li>
<li><a href="Bump_mapping" title="Bump mapping">Bump mapping</a></li>
<li><a href="Ambient_occlusion" title="Ambient occlusion"> Occlusion mapping</a></li>
<li><a href="Specularity#Specular_maps" title="Specularity"> Specular mapping</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Environment</th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Cube_mapping" title="Cube mapping">Cube mapping</a></li>
<li><a href="Sphere_mapping" title="Sphere mapping">Sphere mapping</a></li>
<li><a href="Environment_mapping" class="mw-redirect" title="Environment mapping">Environment mapping</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-03" href="https://en.wikipedia.org/wiki/?title=Texture_mapping&amp;oldid=1303957458">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>